package com.jd.tuning.jvm.jvm.escapse;

public class EscapseTest1 {

    public static  SomeClass someClass;

    /**
     * 全局变量赋值逃逸
     */
    public void gloabalVariablePointerEscapse(){
        //new SomeClass() 局部变量的作用域是在方法
        //someClass 类变量的作用域是在类里
        //作用域被放到大了，显然发生了逃逸
        someClass=new SomeClass();
    }


    /**
     * 方法返回值逃逸
     * 假如发生如下调用
     * someMethod(){
     *     //someClass 在someMethod作用域
     *     SomeClass someClass=methodPointerEscape();
     * }
     * methodPointerEscape new SomeClass() 一开始在方法内部，但是作为返回值返回了
     *
     *  new SomeClass() 的作用域从methodPointerEscape，扩张到了someMethod的方法，发生了逃逸
     */
    public SomeClass  methodPointerEscape(){
        return new SomeClass();
    }


    /**
     * 实例引用逃逸
     * this的作用域原先是在当前实例下的
     * 但是现在扩张到SomeClass的实例下，所以也发生了逃逸
     */
    public void instancePassPointerEscape(){
        this.methodPointerEscape().printClassName(this);
    }


    public void someTest(){
        SomeTest someTest=new SomeTest();
        someTest.age=1;
        someTest.id=1;

        //开启标量替换之后,SomeTest不会创建实例，而是创建成员变量代替，上面的代码被优化
        int age=1;
        int id=1;

    }
}

class  SomeClass{

    public  void printClassName(EscapseTest1 escapseTest1){
        System.out.println(escapseTest1.getClass().getName());
    }
}

class SomeTest{
        int id;
        int age;
}
